Enable support for EL3 interrupt in IMF
authorSoby Mathew <[email protected]>
Mon, 23 Nov 2015 13:58:45 +0000 (13:58 +0000)
committerSoby Mathew <[email protected]>
Wed, 9 Dec 2015 09:58:17 +0000 (09:58 +0000)
This patch enables support for EL3 interrupts in the Interrupt Management
Framework (IMF) of ARM Trusted Firmware. Please note that although the
registration of the EL3 interrupt type is now supported, it has not been
tested on any of the ARM Standard platforms.

Change-Id: If4dcdc7584621522a2f3ea13ea9b1ad0a76bb8a1

bl31/interrupt_mgmt.c
include/bl31/interrupt_mgmt.h

index 206578b4dce23b98ab951a6b3b4e246565c4f962..e9918515baf0549ad218f74070e3c91469fac675 100644 (file)
@@ -67,18 +67,15 @@ typedef struct intr_type_desc {
 static intr_type_desc_t intr_type_descs[MAX_INTR_TYPES];
 
 /*******************************************************************************
- * This function validates the interrupt type. EL3 interrupts are currently not
- * supported.
+ * This function validates the interrupt type.
  ******************************************************************************/
 static int32_t validate_interrupt_type(uint32_t type)
 {
-       if (type == INTR_TYPE_EL3)
-               return -ENOTSUP;
-
-       if (type != INTR_TYPE_S_EL1 && type != INTR_TYPE_NS)
-               return -EINVAL;
+       if (type == INTR_TYPE_S_EL1 || type == INTR_TYPE_NS ||
+                       type == INTR_TYPE_EL3)
+               return 0;
 
-       return 0;
+       return -EINVAL;
 }
 
 /*******************************************************************************
@@ -95,6 +92,9 @@ static int32_t validate_routing_model(uint32_t type, uint32_t flags)
        if (type == INTR_TYPE_NS)
                return validate_ns_interrupt_rm(flags);
 
+       if (type == INTR_TYPE_EL3)
+               return validate_el3_interrupt_rm(flags);
+
        return -EINVAL;
 }
 
index e07ddf83bc159b0c6d8ff4996d3fa31b8a598fbf..0172b607ea36482a2fcfd600a11efe48aa6f309c 100644 (file)
 #define INTR_NS_VALID_RM0              0x0
 /* Routed to EL1/EL2 from NS and to EL3 from Secure */
 #define INTR_NS_VALID_RM1              0x1
+/* Routed to EL3 from NS. Taken to S-EL1 from Secure and handed over to EL3 */
+#define INTR_EL3_VALID_RM0             0x2
+/* Routed to EL3 from NS and Secure */
+#define INTR_EL3_VALID_RM1             0x3
 /* This is the default routing model */
 #define INTR_DEFAULT_RM                0x0
 
  * of interrupt. If the model does not match one of the valid masks
  * -EINVAL is returned.
  ******************************************************************************/
-#define validate_sel1_interrupt_rm(x)  (x == INTR_SEL1_VALID_RM0 ? 0 : \
-                                        (x == INTR_SEL1_VALID_RM1 ? 0 :\
+#define validate_sel1_interrupt_rm(x)  ((x) == INTR_SEL1_VALID_RM0 ? 0 : \
+                                        ((x) == INTR_SEL1_VALID_RM1 ? 0 :\
+                                         -EINVAL))
+
+#define validate_ns_interrupt_rm(x)    ((x) == INTR_NS_VALID_RM0 ? 0 : \
+                                        ((x) == INTR_NS_VALID_RM1 ? 0 :\
                                          -EINVAL))
 
-#define validate_ns_interrupt_rm(x)    (x == INTR_NS_VALID_RM0 ? 0 : \
-                                        (x == INTR_NS_VALID_RM1 ? 0 :\
+#define validate_el3_interrupt_rm(x)   ((x) == INTR_EL3_VALID_RM0 ? 0 : \
+                                        ((x) == INTR_EL3_VALID_RM1 ? 0 :\
                                          -EINVAL))
 
 /*******************************************************************************